/* 
 * Copyright (c) 2007, Andrey Shchekin

 * All rights reserved.

 * Redistribution and use in source and binary forms, with or without modification, are permitted provided 
 * that the following conditions are met:
 *    Redistributions of source code must retain the above copyright notice, this list of conditions and
 * the following disclaimer.
 *    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials provided with the distribution.
 *    Neither the name of the Andrey Shchekin nor the names of other contributors may be used to endorse or 
 * promote products derived from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Text;

using Microsoft.Build.BuildEngine;

namespace AshMind.ProjectTypes.Common.Design {
    public class BuildActionTypeConverter : StringConverter {
        public const string AvailableItemName = "AvailableItemName";

        public override bool GetStandardValuesSupported(ITypeDescriptorContext context) {
            return true;
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) {
            return true;
        }

        private ExtendedProjectNode GetContextProject(ITypeDescriptorContext context) {
            return (context.Instance as ExtendedFileNodeProperties).Node.ProjectMgr;
        }

        // AndreySh: I suppose it should be quite fast
        private void MakeUnique(List<string> values) {
            object stub = new object();

            ListDictionary hash = new ListDictionary();
            for (int i = 0; i < values.Count; i++) {
                if (hash.Contains(values[i])) {
                    values.RemoveAt(i);
                    i -= 1;
                }
                else
                    hash.Add(values[i], stub);
            }
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) {
            ExtendedProjectNode project = this.GetContextProject(context);
            List<string> values = new List<string>(project.GetDefaultBuildActions());

            // AndreySh: may be not the best performance, but I do not see another choice
            // we have to support values that are already there
            PropertyDescriptor property = context.PropertyDescriptor;
            string value = property.GetValue(context.Instance) as string;
            values.Add(value);
            
            foreach (BuildItem item in project.BuildProject.GetEvaluatedItemsByName(AvailableItemName)) {
                values.Add(item.Include);
            }
            this.MakeUnique(values);

            return new StandardValuesCollection(values);
        }
    }
}